/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.ufg.inf.si.poo.formula1.ManagementFiles;

import br.ufg.inf.si.poo.formula1.Circuit.Circuit;
import br.ufg.inf.si.poo.formula1.Driver.Driver;
import br.ufg.inf.si.poo.formula1.Library.Library;
import br.ufg.inf.si.poo.formula1.Season.Season;
import br.ufg.inf.si.poo.formula1.Team.Team;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;

/**
 * ManagementFiles
 *
 * Versao 1.0
 *
 * Data 19/01/2013
 *
 * @author Igor
 */
public class ManagementFiles {
    //Atributos

    private static String diretorio = "./Arquivos/Texto/";

    //Construtores
    private ManagementFiles() {
    }

    //Outros Metodos
    /**
     * Realiza a leitura do arquivo de equipes
     *
     * @param teams, insere equipes no ArrayList de equipes
     */
    public static void readTeam(ArrayList<Team> teams) {
        String nome = "Equipes.txt";

        //Verifica se o arquivo existe
        File file = new File(ManagementFiles.diretorio + nome);
        if (file.exists()) {
            try {
                FileReader arq = new FileReader(ManagementFiles.diretorio + nome);
                BufferedReader lerArq = new BufferedReader(arq);

                /* Faz leitura das primeiras linhas que são as de configuração */
                String shortName = lerArq.readLine();
                String fullName = lerArq.readLine();
                String base = lerArq.readLine();
                String teamPrincipal = lerArq.readLine();
                String techinicalChief = lerArq.readLine();
                String chassis = lerArq.readLine();
                String engine = lerArq.readLine();
                String tyres = lerArq.readLine();
                String strFirstSeason = lerArq.readLine();
                String strWorldChampionships = lerArq.readLine();
                String strHighestRaceFinish1 = lerArq.readLine();
                String strHighestRaceFinish2 = lerArq.readLine();
                String strPolePositions = lerArq.readLine();
                String strFastestLaps = lerArq.readLine();
                String linha = lerArq.readLine();

                int firstSeason;
                int worldChampionships;
                int highestRaceFinish1;
                int highestRaceFinish2;
                int polePositions;
                int fastestLaps;

                while ((shortName = lerArq.readLine()) != null) {
                    fullName = lerArq.readLine();
                    base = lerArq.readLine();
                    teamPrincipal = lerArq.readLine();
                    techinicalChief = lerArq.readLine();
                    chassis = lerArq.readLine();
                    engine = lerArq.readLine();
                    tyres = lerArq.readLine();
                    //Faz a leitura do valor String     //Converte o valor string para inteiro
                    strFirstSeason = lerArq.readLine();
                    firstSeason = Integer.parseInt(strFirstSeason);
                    strWorldChampionships = lerArq.readLine();
                    worldChampionships = Integer.parseInt(strWorldChampionships);
                    strHighestRaceFinish1 = lerArq.readLine();
                    highestRaceFinish1 = Integer.parseInt(strHighestRaceFinish1);
                    strHighestRaceFinish2 = lerArq.readLine();
                    highestRaceFinish2 = Integer.parseInt(strHighestRaceFinish2);
                    strPolePositions = lerArq.readLine();
                    polePositions = Integer.parseInt(strPolePositions);
                    strFastestLaps = lerArq.readLine();
                    fastestLaps = Integer.parseInt(strFastestLaps);

                    Team team = new Team(
                            fullName,
                            shortName,
                            base,
                            teamPrincipal,
                            techinicalChief,
                            chassis,
                            engine,
                            tyres,
                            firstSeason,
                            worldChampionships,
                            highestRaceFinish1,
                            highestRaceFinish2,
                            polePositions,
                            fastestLaps);
                    teams.add(team);
                }

                arq.close();
            } catch (IOException e) {
                System.err.printf("Erro na abertura do arquivo: %s\nArquivo: %s\n", e.getMessage(), nome);
            }
        }
    }

    /**
     * Realiza a escrita no arquivo de equipes
     *
     * @param teams, escreve no arquivos as equipes do ArrayList de equipes
     */
    public static void writeTeam(ArrayList<Team> teams) {
        String nome = "Equipes.txt";

        try {
            FileWriter arq = new FileWriter(ManagementFiles.diretorio + nome);
            PrintWriter escreverArq = new PrintWriter(arq);

            /* Faz escrita das primeiras linhas que são as de configuração */
            escreverArq.println("Short Name");
            escreverArq.println("Full Team Name");
            escreverArq.println("Base");
            escreverArq.println("Team Principal");
            escreverArq.println("Technical Chief");
            escreverArq.println("Chassis");
            escreverArq.println("Engine");
            escreverArq.println("Tyres");
            escreverArq.println("First Season");
            escreverArq.println("World Championships");
            escreverArq.println("Highest Race Finish1");
            escreverArq.println("Highest Race Finish2");
            escreverArq.println("Pole Positions");
            escreverArq.println("Fastest Laps");
            escreverArq.println("************");

            for (int i = 0; i < teams.size(); i++) {
                if (teams.get(i) != null) {
                    escreverArq.println(teams.get(i).getShortName());
                    escreverArq.println(teams.get(i).getFullName());
                    escreverArq.println(teams.get(i).getBase());
                    escreverArq.println(teams.get(i).getTeamPrincipal());
                    escreverArq.println(teams.get(i).getTechinicalChief());
                    escreverArq.println(teams.get(i).getChassis());
                    escreverArq.println(teams.get(i).getEngine());
                    escreverArq.println(teams.get(i).getTyres());
                    escreverArq.println(teams.get(i).getFirstSeason());
                    escreverArq.println(teams.get(i).getWorldChampionchips());
                    escreverArq.println(teams.get(i).getHighestRaceFinish()[0]);
                    escreverArq.println(teams.get(i).getHighestRaceFinish()[1]);
                    escreverArq.println(teams.get(i).getPolePositions());
                    escreverArq.println(teams.get(i).getFastesLaps());
                }
            }

            arq.close();
        } catch (IOException e) {
            System.err.printf("Erro na abertura do arquivo: %s\nArquivo: %s\n", e.getMessage(), nome);
        }
    }

    /**
     * Realiza a leitura do arquivo de pilotos
     *
     * @param drivers, insere pilotos no ArrayList de pilotos
     */
    public static void readDriver(ArrayList<Driver> drivers) {
        String nome = "Pilotos.txt";

        //Verifica se o arquivo existe
        File file = new File(ManagementFiles.diretorio + nome);
        if (file.exists()) {
            try {
                FileReader arq = new FileReader(ManagementFiles.diretorio + nome);
                BufferedReader lerArq = new BufferedReader(arq);

                /* Faz leitura das primeiras linhas que são as de configuração */
                String driverName = lerArq.readLine();
                String nationality = lerArq.readLine();
                String strPodiums = lerArq.readLine();
                String strGrandPrixEntered = lerArq.readLine();
                String strWorldChampionships = lerArq.readLine();
                String strHighestRaceFinish1 = lerArq.readLine();
                String strHighestRaceFinish2 = lerArq.readLine();
                String strHighestRacePosition1 = lerArq.readLine();
                String strHighestRacePosition2 = lerArq.readLine();
                String dateBirth = lerArq.readLine();
                String placeBirth = lerArq.readLine();
                String linha = lerArq.readLine();

                int podiums;
                int grandPrixEntered;
                int worldChampionships;
                int[] highestRaceFinish = new int[2];
                int[] highestRacePosition = new int[2];

                while ((driverName = lerArq.readLine()) != null) {
                    nationality = lerArq.readLine();
                    strPodiums = lerArq.readLine();
                    podiums = Integer.parseInt(strPodiums);
                    strGrandPrixEntered = lerArq.readLine();
                    grandPrixEntered = Integer.parseInt(strGrandPrixEntered);
                    strWorldChampionships = lerArq.readLine();
                    worldChampionships = Integer.parseInt(strWorldChampionships);
                    strHighestRaceFinish1 = lerArq.readLine();
                    highestRaceFinish[0] = Integer.parseInt(strHighestRaceFinish1);
                    strHighestRaceFinish2 = lerArq.readLine();
                    highestRaceFinish[1] = Integer.parseInt(strHighestRaceFinish2);
                    strHighestRacePosition1 = lerArq.readLine();
                    highestRacePosition[0] = Integer.parseInt(strHighestRacePosition1);
                    strHighestRacePosition2 = lerArq.readLine();
                    highestRacePosition[1] = Integer.parseInt(strHighestRacePosition2);
                    dateBirth = lerArq.readLine();
                    placeBirth = lerArq.readLine();

                    Driver driver = new Driver(
                            driverName,
                            nationality,
                            podiums,
                            grandPrixEntered,
                            worldChampionships,
                            highestRaceFinish,
                            highestRacePosition,
                            dateBirth,
                            placeBirth);
                    drivers.add(driver);
                }

                arq.close();
            } catch (IOException e) {
                System.err.printf("Erro na abertura do arquivo: %s\nArquivo: %s\n", e.getMessage(), nome);
            }
        }
    }

    /**
     * Realiza a escrita no arquivo de pilotos
     *
     * @param season, escreve no arquivos os pilotos do ArrayList de pilotos
     */
    public static void writeDriver(ArrayList<Driver> drivers) {
        String nome = "Pilotos.txt";

        try {
            FileWriter arq = new FileWriter(ManagementFiles.diretorio + nome);
            PrintWriter escreverArq = new PrintWriter(arq);

            /* Faz escrita das primeiras linhas que são as de configuração */
            escreverArq.println("Name");
            escreverArq.println("Nationality");
            escreverArq.println("Podiums");
            escreverArq.println("Grand Prix entered");
            escreverArq.println("World Championships");
            escreverArq.println("Highest race finish[0]");
            escreverArq.println("Highest race finish[1]");
            escreverArq.println("Highest grip position[0]");
            escreverArq.println("Highest grip position[1]");
            escreverArq.println("Date of Birth");
            escreverArq.println("Place of Birth");
            escreverArq.println("************");

            for (int i = 0; i < drivers.size(); i++) {
                if (drivers.get(i) != null) {
                    escreverArq.println(drivers.get(i).getDriverName());
                    escreverArq.println(drivers.get(i).getNationality());
                    escreverArq.println(drivers.get(i).getPodiums());
                    escreverArq.println(drivers.get(i).getGrandPrixEntered());
                    escreverArq.println(drivers.get(i).getWorldChampionships());
                    escreverArq.println(drivers.get(i).getHighestRaceFinish()[0]);
                    escreverArq.println(drivers.get(i).getHighestRaceFinish()[1]);
                    escreverArq.println(drivers.get(i).getHighestGridPosition()[0]);
                    escreverArq.println(drivers.get(i).getHighestGridPosition()[1]);
                    escreverArq.println(drivers.get(i).getDateBirth());
                    escreverArq.println(drivers.get(i).getPlaceBirth());
                }
            }

            arq.close();
        } catch (IOException e) {
            System.err.printf("Erro na abertura do arquivo: %s\nArquivo: %s\n", e.getMessage(), nome);
        }
    }

    /**
     * Realiza a leitura do arquivo de circuitos
     *
     * @param circuit, insere os circuitos no ArrayList de ciruios
     */
    public static void readCircuit(ArrayList<Circuit> circuits) {
        String nome = "Circuitos.txt";

        //Verifica se o arquivo existe
        File file = new File(ManagementFiles.diretorio + nome);
        if (file.exists()) {
            try {
                FileReader arq = new FileReader(ManagementFiles.diretorio + nome);
                BufferedReader lerArq = new BufferedReader(arq);

                /* Faz leitura das primeiras linhas que são as de configuração */
                String circuitName = lerArq.readLine();
                String strFirstGrandPrix = lerArq.readLine();
                String strNumberLaps = lerArq.readLine();
                String strCircuitLength = lerArq.readLine();
                String strRaceDistance = lerArq.readLine();
                String strLapRecordTime = lerArq.readLine();
                String lapRecordDriver = lerArq.readLine();
                String country = lerArq.readLine();
                String city = lerArq.readLine();
                String linha = lerArq.readLine();

                int firstGrandPrix;
                int numberLaps;
                double circuitLength;
                double raceDistance;
                long lapRecordTime;

                while ((circuitName = lerArq.readLine()) != null) {
                    strFirstGrandPrix = lerArq.readLine();
                    firstGrandPrix = Integer.parseInt(strFirstGrandPrix);
                    strNumberLaps = lerArq.readLine();
                    numberLaps = Integer.parseInt(strNumberLaps);
                    strCircuitLength = lerArq.readLine();
                    circuitLength = Double.parseDouble(strCircuitLength);
                    strRaceDistance = lerArq.readLine();
                    raceDistance = Double.parseDouble(strRaceDistance);
                    strLapRecordTime = lerArq.readLine();
                    lapRecordTime = Integer.parseInt(strLapRecordTime);
                    lapRecordDriver = lerArq.readLine();
                    country = lerArq.readLine();
                    city = lerArq.readLine();

                    Circuit circuit = new Circuit(
                            "",
                            circuitName,
                            firstGrandPrix,
                            numberLaps,
                            circuitLength,
                            raceDistance,
                            lapRecordTime,
                            lapRecordDriver,
                            country,
                            city);
                    circuits.add(circuit);
                }

                arq.close();
            } catch (IOException e) {
                System.err.printf("Erro na abertura do arquivo: %s\nArquivo: %s\n", e.getMessage(), nome);
            }
        }
    }

    /**
     * Realiza a escrita no arquivo de circuitos
     *
     * @param circuits, escreve no arquivos os circuitos do ArrayList de
     * circuitos
     */
    public static void writeCircuit(ArrayList<Circuit> circuits) {
        String nome = "Circuitos.txt";

        try {
            FileWriter arq = new FileWriter(ManagementFiles.diretorio + nome);
            PrintWriter escreverArq = new PrintWriter(arq);

            /* Faz escrita das primeiras linhas que são as de configuração */
            escreverArq.println("Circuit Name");
            escreverArq.println("First Grand Prix");
            escreverArq.println("Number Laps");
            escreverArq.println("Circuit Length");
            escreverArq.println("Race Distance");
            escreverArq.println("Lap Record Time (Milessegundos)");
            escreverArq.println("Lap Record Driver");
            escreverArq.println("Country");
            escreverArq.println("City");
            escreverArq.println("************");

            for (int i = 0; i < circuits.size(); i++) {
                if (circuits.get(i) != null) {
                    escreverArq.println(circuits.get(i).getCircuitName());
                    escreverArq.println(circuits.get(i).getFirstGrandPrix());
                    escreverArq.println(circuits.get(i).getNumberLaps());
                    escreverArq.println(circuits.get(i).getCircuitLength());
                    escreverArq.println(circuits.get(i).getRaceDistance());
                    escreverArq.println(circuits.get(i).getLapRecordTime());
                    escreverArq.println(circuits.get(i).getLapRecordDriver());
                    escreverArq.println(circuits.get(i).getCountry());
                    escreverArq.println(circuits.get(i).getCity());
                }
            }

            arq.close();
        } catch (IOException e) {
            System.err.printf("Erro na abertura do arquivo: %s\nArquivo: %s\n", e.getMessage(), nome);
        }
    }

    /**
     * Realiza a leitura do arquivo de temporadas
     *
     * @param season, insere temporadas no ArrayLint de temporadas
     */
    public static void readSeason(ArrayList<Season> season) {
        String nome = "Temporadas.txt";

        //Verifica se o arquivo existe
        File file = new File(ManagementFiles.diretorio + nome);
        if (file.exists()) {
            try {
                FileReader arq = new FileReader(ManagementFiles.diretorio + nome);
                BufferedReader lerArq = new BufferedReader(arq);

                /* Faz leitura das primeiras linhas que são as de configuração */
                String strYear = lerArq.readLine();
                String linha = lerArq.readLine();

                int intYear;

                while ((strYear = lerArq.readLine()) != null) {
                    //Converte o valor string para inteiro
                    intYear = Integer.parseInt(strYear);
                    Season season1 = new Season(intYear);

                    String folder = ManagementFiles.diretorio + "Temporadas/" + strYear + "/";
                    //Realiza a leitura das 13 equipes (no maximo 13)
                    ManagementFilesSeason.readTeamSeason(season1, folder);
                    //Vincula os pilotos com as equipes
                    ManagementFilesSeason.readHireDriverSeason(season1, folder);
                    //Realiza a leitura dos 20 circuitos (no maximo 20)
                    ManagementFilesSeason.readCircuitSeason(season1, folder);
                    //Realiza a leitura das 20 corridas (no maximo 20)
                    ManagementFilesSeason.readRaceSeason(season1, folder);
                    //Crias as corridas que por algum motivo nao foram salvas
                    ManagementFilesSeason.createRaceSeason(season1);
                    //Faz a leitura do campeonato mundial de pilotos
                    ManagementFilesSeason.readWorldChampionshipDrivers(season1, folder);
                    //Faz a leitura do campeonato mundial de construtores
                    ManagementFilesSeason.readWorldChampionshipBuilders(season1, folder);
                    
                    //Reseta as configuracoes principais, pois o inicio eles nao devem possuir vinculo com temporadas
                    ManagementFilesSeason.resetDataSeason();
                    

                    season.add(season1);
                }

                arq.close();
            } catch (IOException e) {
                System.err.printf("Erro na abertura do arquivo: %s\nArquivo: %s\n", e.getMessage(), nome);
            }
        }
    }

    /**
     * Realiza a escrita no arquivo de temporadas
     *
     * @param season, escreve no arquivos as temporadas do ArrayList de
     * temporadas
     */
    public static void writeSeason(ArrayList<Season> season) {
        String nome = "Temporadas.txt";


        try {
            FileWriter arq = new FileWriter(ManagementFiles.diretorio + nome);
            PrintWriter escreverArq = new PrintWriter(arq);

            /* Faz escrita das primeiras linhas que são as de configuração */
            escreverArq.println("Ano");
            escreverArq.println("************");

            for (int i = 0; i < season.size(); i++) {
                if (season.get(i) != null) {
                    escreverArq.println(season.get(i).getYear());

                    //Cria a posta se nao existir
                    String folder = ManagementFiles.diretorio + "Temporadas/" + season.get(i).getYear() + "/";
                    File pasta = new File(folder);
                    if (!pasta.exists()) {
                        File dir = new File(folder);
                        dir.mkdirs();
                    }

                    //EQUIPES: Escreve as 13 equipes da temporada
                    ManagementFilesSeason.writeTeamSeason(season.get(i), folder);

                    //CIRCUITOS: Escreve os 20 circuitos da temporada
                    ManagementFilesSeason.writeCircuitSeason(season.get(i), folder);
                    
                    //CORRIDAS: Escreve as 20 corridas da temporada
                    ManagementFilesSeason.createRaceSeason(season.get(i));
                    ManagementFilesSeason.writeRaceSeason(season.get(i), folder);
                }
            }

            arq.close();
        } catch (IOException e) {
            System.err.printf("Erro na abertura do arquivo: %s\nArquivo: %s\n", e.getMessage(), nome);
        }
    }
}
